#ifndef ONVIF_WSDL_SERVICE_HPP
#define ONVIF_WSDL_SERVICE_HPP

#include <string>
#include <unordered_map>

namespace El {
namespace Onvif {

/**
 * @brief WSDL文档类型枚举
 */
enum class WSDLType {
    Device,    // 设备管理服务WSDL
    Media,     // 媒体服务WSDL
    PTZ,       // PTZ控制服务WSDL
    Imaging,   // 图像服务WSDL (预留)
    Events,    // 事件服务WSDL (预留)
    Analytics  // 视频分析服务WSDL (预留)
};

/**
 * @brief WSDL文档服务类
 * 负责生成和提供ONVIF标准的WSDL文档
 */
class WSDLService {
public:
    WSDLService(const std::string& baseUrl = "");
    ~WSDLService() = default;

    /**
     * @brief 获取指定类型的WSDL文档
     * @param type WSDL文档类型
     * @return WSDL文档内容
     */
    std::string GetWSDL(WSDLType type) const;

    /**
     * @brief 根据路径获取WSDL文档
     * @param path 请求路径 (如 "/onvif/device_service", "/onvif/media_service")
     * @return WSDL文档内容，如果路径不匹配返回空字符串
     */
    std::string GetWSDLByPath(const std::string& path) const;

    /**
     * @brief 检查是否是WSDL请求
     * @param path 请求路径
     * @return 如果是WSDL请求返回true
     */
    bool IsWSDLRequest(const std::string& path) const;

private:
    /**
     * @brief 初始化路径映射
     */
    void InitializePathMapping();

    /**
     * @brief 生成设备管理服务WSDL
     * @return WSDL文档内容
     */
    std::string GenerateDeviceWSDL() const;

    /**
     * @brief 生成媒体服务WSDL
     * @return WSDL文档内容
     */
    std::string GenerateMediaWSDL() const;

    /**
     * @brief 生成PTZ服务WSDL
     * @return WSDL文档内容
     */
    std::string GeneratePTZWSDL() const;

    /**
     * @brief 生成图像服务WSDL
     * @return WSDL文档内容
     */
    std::string GenerateImagingWSDL() const;

    /**
     * @brief 生成事件服务WSDL
     * @return WSDL文档内容
     */
    std::string GenerateEventsWSDL() const;

    /**
     * @brief 生成分析服务WSDL
     * @return WSDL文档内容
     */
    std::string GenerateAnalyticsWSDL() const;

    /**
     * @brief 生成通用WSDL头部
     * @param serviceName 服务名称
     * @param targetNamespace 目标命名空间
     * @return WSDL头部内容
     */
    std::string GenerateWSDLHeader(const std::string& serviceName,
                                   const std::string& targetNamespace) const;

    /**
     * @brief 生成通用WSDL尾部
     * @return WSDL尾部内容
     */
    std::string GenerateWSDLFooter() const;

    /**
     * @brief 转义XML特殊字符
     * @param input 原始文本
     * @return 转义后的文本
     */
    std::string EscapeXml(const std::string& input) const;

private:
    /// 基础URL
    std::string baseUrl_;
    /// WSDL路径映射表
    std::unordered_map<std::string, WSDLType> pathMapping_;
};

} // namespace Onvif
} // namespace El

#endif // ONVIF_WSDL_SERVICE_HPP 